#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=105;

int n,cnt,cnt1,cnt2;
int co[N],adj[N][N];
vector<int> mp[N];

struct node{
	bool v;
	int c,pre; 
}f[N*2][N*2];

void dfs(int u,int c){
	co[u]=c;
	mp[cnt].push_back(u);
	if(c==1)cnt1++;
	else cnt2++;
	for(int i=1;i<=n;i++){
		if(!adj[u][i])continue;
		if(!co[v]){
			dfs(v,c%2+1);
		}
		else{
			if(co[v]==c) {cout<<"No solution";exit(0);}
		}
	}
}

void solve(){
    cin>>n;
    for(int i=1;i<=n;i++){
    	int v;
    	adj[i][v]=1;
    }

    for(int i=1;i<=n;i++){
    	for(int j=i+1;j<=n;j++){
    		if(adj[i][j]!=adj[j][i])
    			adj[i][j]=adj[j][i]=0;
    	}
    }

    f[0][0].v=0;
    for(int i=1;i<=n;i++){
    	if(c[i]==0){
    		++cnt;
    		cnt1=0,cnt2=0;
    		dfs(i,1);
    		for(int j=n/2;j+1;j++){
    			if(j-cnt1>=0 && f[cnt-1][j-cnt1].v){
    				f[cnt][j].v=true;
    				f[cnt][j].pre=j-cnt1;
    				f[cnt][j].c=1;
    			}
    			if(j-cnt2>=0 && f[cnt-1][j-cnt2].v){
    				f[cnt][j].v=true;
    				f[cnt][j].pre=j-cnt2;
    				f[cnt][j].c=1;
    			}
    		}
    	}
    }
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int t=1;
    // cin>>t;
    while(t--){
        solve();
    }
    return 0;
}